home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 2002 #3
/
Amiga Plus CD - 2002 - No. 03.iso
/
AmiSoft
/
Util
/
Crypt
/
Ppdecrypt.lha
/
ppdecrypt.s
< prev
Wrap
Text File
|
1997-06-23
|
36KB
|
1,552 lines
*******************************************************************************
* PowerPacker [ENCRYPTED EXECUTABLE] Cracker/Decryptor v1.02
* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
* $Release : 0.1 $
* $Revision : 1.02 $
* $Date : 20-Sep-94 $
*
* $Author(s) : Written by 2-Cool/LSd! (In MC680x0 Assembly under Asm-One)
* $Note(s) : Position Independacy off a4 - (WARNING: DON`T TRASH A4!)
* : Execbase Ptr is cached so that if running in fastmem access
* : to execbase ptr is faster.
*
* $Purpose : This program cracks wide open the protection on PowerPacker
* : executables encrypted with a password. PowerPacker has some
* : main fundemental flaws in its encryption, suffice to say
* : this program can decrypt the passwords with ease in seconds,
* : not days or months!
* :
* : The program will decrypt the original protection code then
* : re-encrypt it with the password 'lsd' (Make sure you enter
* : it in LOWERCASE not UPPER!) This is only required if you
* : wish to unpack it with PowerPacker to return it to its
* : original unpacked state since the decrunch header is modified
* : to automatically enter the password for you so it will run
* : without any password prompts!
* :
* : Note to author of PowerPacker: Nico, PowerPacker`s encryption
* : is totally lame, take a loooong look at PGP and LEARN!
*******************************************************************************
AbsExecBase = 4 /* Execbase Definition */
SUCCESS = 0 /* result return codes... */
VAR_ERROR = 1 /* memory alloction failcode */
CSI = $1b
hunk_unit = $3e7
hunk_name = $3e8
hunk_code = $3e9
hunk_data = $3ea
hunk_bss = $3eb
hunk_reloc32 = $3ec
hunk_reloc16 = $3ed
hunk_reloc8 = $3ee
hunk_ext = $3ef
hunk_symbol = $3f0
hunk_debug = $3f1
hunk_end = $3f2
hunk_header = $3f3
hunk_overlay = $3f5
hunk_break = $3f6
CLS macro
dc.b CSI,'c',LF
endm
_LVORawIOInit = -$1F8
*-------------- Definition Includes...
incdir _include:
include exec/exec.i
include "include:exec/funcdef.i"
include intuition/intuition.i
include graphics/videocontrol.i
include libraries/asl.i
include libraries/gadtools.i
include libraries/dos_lib.i
include libraries/intuition_lib.i
include libraries/graphics_lib.i
include libraries/exec_lib.i
include libraries/asl_lib.i
include libraries/icon_lib.i
include libraries/diskfont_lib.i
include libraries/gadtools_lib.i
include libraries/wb_lib.i
include libraries/rexxsyslib_lib.i
include libraries/utility_lib.i
include libraries/dosextens.i
include utility/tagitem.i
include dos/datetime.i
include libraries/reqtools.i
*-------------- Definition of Main Variables (Public) Block...
STRUCTURE VarsBlock,0
APTR _ExecBase /* ExecBase base */
APTR _DOSBase /* DOS lib base */
APTR _DOSOutput /* DOS output base */
APTR _ArgPtr /* CLI Args ptr */
ULONG _ArgLen /* CLI Args length */
APTR _AslBase /* Asl lib base */
APTR _Asl_Request /* Requester struct */
APTR _PrtfBase /* Printf fmstr base */
APTR ProgBuff /* ptr to progbuffer */
APTR ProgHandle /* ptr to filehandle */
ULONG ProgSize /* length file */
APTR FilePath.arg /* argstream pathptr */
STRUCT _PathBuffer,256 /* path buffer */
APTR DecBuff /* Decrunch Buff Ptr */
ULONG DecSize /* Decrunch Buff size */
LABEL vars_SIZEOF
*-------------- Definition of Macros...
PUSH macro
movem.l \1,-(sp)
endm
PULL macro
movem.l (sp)+,\1
endm
PUSHW macro
movem.w \1,-(sp)
endm
PULLW macro
movem.w (sp)+,\1
endm
PUSHR macro
move.l \1,-(sp)
endm
PULLR macro
move.l (sp)+,\1
endm
CALL macro
jsr _LVO\1(a6)
endm
CALLJ macro
jmp _LVO\1(a6)
endm
CALLREL macro
move.l \2(a4),a6
CALL \1
endm
*******************************************************************************
*-------------- Allocate our Variables (RS.) Area
ProgStart: move.l a0,a5
move.l d0,d5
move.l #vars_SIZEOF,d0 ;length for our variables
move.l #MEMF_PUBLIC+MEMF_CLEAR,d1 ;we want public mem, cleared
move.l (AbsExecBase).w,a6 ;get SysBase
CALL AllocMem ;allocate it...
move.l d0,a4 ;ptr to our RS.Variables base
bne.s RSValid ;did the alloc fail, if so exit
moveq #VAR_ERROR,d0 ;Memory allocation fail code
rts ;exit to dos...
*-------------- Place Version String here so it can be quickly found.
Version: dc.b "$VER: PPDecrypt v1.02 (Sep-94)",0
even
*-------------- From here a4 points to our variables area (DON`T DESTROY A4!)
RSValid: move.l a6,(a4) ;cache execptr in Public so if
;we are in fastmem were faster
move.l a5,_ArgPtr(a4)
move.l d5,_ArgLen(a4)
clr.b -1(a5,d5.w) ;null terminate arg string..
*-------------- Open DOS Library
moveq #36,d0 ;set lib version
lea Dosname(pc),a1 ;lib name in a1
CALL OpenLibrary ;try to open library
move.l d0,_DOSBase(a4) ;store lib base
beq.w ShutDown ;cleanup and quit if fail
*-------------- Get DOS Output
move.l d0,a6 ;get dosbase
CALL Output ;get output base
move.l d0,_DOSOutput(a4) ;save outputbase
*-------------- Open ASL Library
move.l (a4),a6 ;get execbase
moveq #36,d0 ;set lib version
lea Aslname(pc),a1 ;lib name in a1
CALL OpenLibrary ;try to open library
move.l d0,_AslBase(a4) ;store lib base
beq.w ASLError ;cleanup and quit if fail
*-------------- Allocate ASL Requester
move.l d0,a6 ;get asl base in a6
moveq #ASL_FileRequest,d0 ;requester type
lea MainTags(pc),a0 ;taglist
CALL AllocAslRequest ;allocate asl request struct
move.l d0,_Asl_Request(a4) ;save request struct
beq.w AllocError ;show 'out of memory' msg
*-------------- Initialise 'printf' routines...
bsr.w _PrintInit ;initialise printf memory
beq.w AllocError ;show 'out of memory' msg
*-------------- Program starts here
lea About.Txt(pc),a0 ;format string
bsr.w PutStr
*-------------- Show usage message or request a filename?
move.l _ArgPtr(a4),a0
cmp.b #"?",(a0)
beq.s show_usage
cmp.b #LF,(a0)
beq.s no_filename
tst.b (a0)
beq.s no_filename
bra.s ShowFName
show_usage: lea Args.Txt(pc),a0 ;format string
bsr.w PutStr
bra.w ShutDown
*-------------- Example ASL Requester 'LOAD'
no_filename: lea Select.Txt(pc),a0 ;format string
bsr.w PutStr
;-------------- Example ASL Requester 'LOAD'
lea LoadTags(pc),a1 ;address of taglist
lea LoadText(pc),a2 ;ptr to requester hail text
bsr.w RequestASL
beq.w NoName ;load 'express failed'
ShowFName: move.l a0,-(sp)
lea FilePath.arg(a4),a1 ;arguments stream
move.l a0,(a1) ;pathname into arg stream
lea FilePath.fmt(pc),a0 ;format string
bsr.w printf
move.l (sp)+,a0 ;a0=filename ptr
*-------------- Load DOS file into buffer
bsr.w LoadDOSFile
cmp.b #-2,d0
beq.w LoadFailedMem ;load 'express failed'
cmp.b #-1,d0
beq.w LoadNotFound
*-------------- Now do the processing bits here...
move.l ProgBuff(a4),a0
move.l ProgSize(a4),d0
bsr ProcessData
beq.s dosave ;was it successful?
lea ErrorType.txt(pc),a0
bsr PutStr
bra.s ShutDown
*-------------- Example ASL Requester 'SAVE'
dosave: lea Done.Txt(pc),a0 ;format string
move.b PatchType(pc),d0
beq.s normal_hd
lea Done2.Txt(pc),a0 ;format string
normal_hd bsr.w PutStr
lea SaveTags(pc),a1 ;address of taglist
lea SaveText(pc),a2 ;ptr to requester hail text
bsr.w RequestASL
beq.w NoName
move.l a0,-(sp)
lea FilePath.arg(a4),a1 ;arguments stream
move.l a0,(a1) ;pathname into arg stream
lea FilePath2.fmt(pc),a0 ;format string
bsr.w printf
move.l (sp)+,a0 ;a1=name of file to save
bsr.w SaveDOSFile ;save out the file!!!
*-------------- Free decrunch memory buffer...
move.l d0,-(sp)
move.l DecBuff(a4),d0 ;ptr to our RS.Variables base
beq.s no_decmem
move.l d0,a1
move.l DecSize(a4),d0 ;no. of bytes to free
beq.s no_decmem
move.l (a4),a6 ;get execbase
CALL FreeMem ;free the memory
no_decmem move.l (sp)+,d0
cmp.b #1,d0
beq.b SaveError
*-------------- Program ends here
*******************************************************************************
* Shutdown() - Free all allocated resources & exit program
* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
* Frees all previously allocated resources, sanity checks are made so only
* allocated memory/open libraries will be removed.
*******************************************************************************
ShutDown: bsr.w FreeDOSFile
*-------------- Free 'printf' memory
bsr.w _PrintClose ;free printf memory
*-------------- Free Allocated ASL File-Requester
move.l _Asl_Request(a4),d0 ;get request struct
beq.s FreeASL
move.l d0,a0
move.l _AslBase(a4),a6
CALL FreeAslRequest
*-------------- Free ASL Library
FreeASL: move.l (a4),a6 ;get execbase
move.l _AslBase(a4),d0 ;asl lib base in a1
beq.s FreeDOS
move.l d0,a1
CALL CloseLibrary ;close asl
*-------------- Free DOS Library
FreeDOS: move.l _DOSBase(a4),d0 ;dos lib base in a1
beq.s RSFreeMem
move.l d0,a1
CALL CloseLibrary ;close intuition
clr.l _DOSBase(a4) ;clear out base
*-------------- Free RS Variables Area
RSFreeMem: move.l a4,a1 ;ptr to our RS.Variables base
move.l #vars_SIZEOF,d0 ;no. of bytes to free
move.l (a4),a6 ;get execbase
CALL FreeMem ;free the memory
moveq #SUCCESS,d0 ;no return code
rts ;exit...
AllocError: lea ErrorAlloc.txt(pc),a0
bra.s showmsg
LoadFailedMem lea ErrorMem.txt(pc),a0
bra.s showmsg
LoadNotFound lea ErrorLoad.txt(pc),a0
bra.s showmsg
SaveError lea ErrorSave.txt(pc),a0
bra.s showmsg
ASLError lea ErrorASL.txt(pc),a0
bra.s showmsg
NoName lea NoName.txt(pc),a0
showmsg bsr.w PutStr
bra.s ShutDown
*******************************************************************************
* PowerPacker HUNK Scanner
* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
* Firstly we need to scan through the code & data hunks to get the correct
* addresses of the packed data, the pack_data info and the unpacking code and
* password prompting code...
*******************************************************************************
ProcessData: cmp.l #hunk_header,(a0)+ ; must start with a hunk_header
bne.w reloc_error ; if not we`ve got problems!
tst.l (a0)+ ; if its named, skip name
bne.w reloc_error ; if 0 its alright!
move.l (a0)+,d7 ; read no. hunks from LoadBuffer
move.l d7,d6 ; d6=copy of no.hunks...
add.l d7,d7
add.l d7,d7
add.l d7,d7 ; 2 long words per hunk
sub.l d7,sp
addq.w #8,a0 ; skip first/last hunk nos
move.l sp,a1
move.l sp,a5
hunksetuplp move.l (a0)+,d0 ; get hunk length
add.l d0,d0
add.l d0,d0 ; x4 Get address from BCPL ptr
addq.l #8,a3 ; add segment header
add.l d0,a3
subq.l #1,d6
bne.s hunksetuplp
move.l d7,d0 ; zero count+8 bytes per hunk
hunksumlp add.l (sp)+,d0 ; add lengths etc.
addq.l #4,sp ; recover stack at same time!
subq.l #8,d7
bne.s hunksumlp
relocok cmp.l #hunk_code,(a0)+ ; hope we got a code_hunk..
bne.w reloc_error
move.l (a0)+,d0
GetHeaderType: movem.l d0-d7/a0-a6,-(sp)
lea WorkingN.Txt(pc),a1 ;format string
sf.b PatchType-WorkingN.Txt(a1)
cmp.l #$0c05000d,$5a(a0) ;\ Check thats its really
bne.w notreallypp ; \ a PowerPacker encrypted
cmp.w #$b998,$90(a0) ; \_ executable file..
beq.w not_big
notreallypp: lea WorkingH.Txt(pc),a1 ;format string
st.b PatchType-WorkingH.Txt(a1)
cmp.w #$4EaE,$30(a0)
bne.w reloc_error
not_big move.l a1,a0
bsr.w PutStr
movem.l (sp)+,d0-d7/a0-a6
move.l a0,a3
move.l a0,-(sp)
add.l d0,d0
add.l d0,d0
add.l d0,a0
move.l a0,a1
lea 8(a1),a1
move.l (a1)+,d0
add.l d0,d0
add.l d0,d0
add.l d0,a1 ;end of hunk
lea 12(a0),a6 ;a6.l = PP SrcData Start Ptr
*-------------- Offset for for normal header files
lea -10(a0),a5 ;a5.l = PP Data Info
move.b PatchType(pc),d0
beq.s not_header
*-------------- Offset for Library Header files
lea -12(a0),a5 ;a5.l = PP Data Info
not_header
move.l 4(a5),d0 ;Original Length
bsr find_cmode
move.l a1,a2
sub.l a0,a2
lea -16(a2),a2
move.l a2,d6
move.l d6,d7
lsr.l #2,d6
subq.l #1,d6 ; decrypt length (for dbra)
*-------------- PowerPacker DECRYPTOR (PASS - 1)
* Determine the 1st 3 bytes of the Longword password...
*
* We do this by checking against the ~magic~ numbers, $xx16785C
* or $xx2cf0b8 which will always be present in normal
* (non-encrypted) PowerPacked executables. This number is the
* PowerPacked (crunched) equivelent '$000003F2 $0000000' Standard
* DOSExecutable hunk header, Therefore when we 'un-eor' the 1st 4
* bytes of the packed data with the correct un-eor value we KNOW
* we have obtained the 1st 3 bytes of the password!
lea DecryptLoop(pc),a2
moveq #0,d4
move.l (a6),d1 ;d1=$xxxx xxxx to un-eor
move.l #$00ffffff,d5
DecryptLoop: eor.l d4,d1
move.l d1,d3
and.l d5,d3
cmp.l d2,d3
beq.s cracked_it
eor.l d4,d1
addq.l #1,d4 ;next try
jmp (a2)
*-------------- PowerPacker DECRYPTOR (PASS - 2)
* Determine the last bytes of the Longword password...
cracked_it: movem.l d0-d7/a0-a6,-(sp)
lea Pass2.Txt(pc),a0 ;format string
bsr.w PutStr
movem.l (sp)+,d0-d7/a0-a6
move.l a1,a0
movem.l d4-d7/a0-a6,-(sp)
add.l #10000,d0 ;Unpacked size + 10k
move.l d0,DecSize(a4) ;save original alloc size
move.l #MEMF_PUBLIC+MEMF_CLEAR,d1 ;we want public mem, cleared
move.l (AbsExecBase).w,a6 ;get SysBase
CALL AllocMem ;allocate it...
movem.l (sp)+,d4-d7/a0-a6
move.l d0,DecBuff(a4) ;save decrunch buffer Ptr
bne.s alloc_okay
tst.l (sp)+ ;correct stack...
bra.w AllocError
alloc_okay: move.l d0,a3 ;ptr to dest mem
lea 5000(a3),a3 ;+5k minimum safe distance
;on either side..
move.l #$000003f3,d5
move.l #$01000000,d3
;d0.l = Original Unpacked Length..
;d4.l = EOR Value (excluding high byte) $??XXXXXX
;d6.l = EOR Decrypt Size
;
;a0.l = PP_SrcData End
;a3.l = Unpacked Destination
;a5.l = PP_SrcData Info
;a6.l = PP_SrcData Start
;
*-------------- decrypt with current EOR Value..
DecLoop: move.l a6,a2
move.l d6,d1
.un_eor: eor.l d4,(a2)+
dbra d1,.un_eor
*-------------- now attempt uncompression
movem.l d0/d3-d7/a0-a6,-(sp)
bsr PPDecrunch
movem.l (sp)+,d0/d3-d7/a0-a6
move.l a0,-(sp)
lea Dot.Txt(pc),a0
bsr PutStr
move.l (sp)+,a0
cmp.l (a3),d5
beq.s valid
*-------------- was the wrong eor value, so return it to normal..
move.l a6,a2
move.l d6,d1
.re_eor: eor.l d4,(a2)+
dbra d1,.re_eor
add.l d3,d4
move.l d4,d1
and.l #$ff000000,d1
bne.s DecLoop
addq.l #1,d4
move.l a0,-(sp)
lea Deep.Txt(pc),a0
bsr PutStr
move.l (sp)+,a0
bra.s DecLoop
valid:
;a0.l = PP_SrcData End
;a3.l = Unpacked File Ptr
;d0.l = Unpacked Length
move.l (sp)+,a1
move.l a6,a2
move.l d6,d1
tmp move.l #$021400e6,d4
.re_eor: eor.l d4,(a2)+
dbra d1,.re_eor
move.b PatchType(pc),d0
bne.s header_ppdata2
move.w BR(pc),$0C(a1)
move.l d4,$7A(a1)
move.w tmp(pc),$78(a1)
move.w #$086c,$6a(a1) ;patch password checksum in normal header
bra.w not_header2
header_ppdata2: move.w #$086c,$26(a1) ;patch password checksum in library header
not_header2: addq.l #4,a0
move.l ProgBuff(a4),a1
move.l a1,d0
sub.l a1,d0
move.l tempptr(pc),a2
move.l temp(pc),(a2)
*-------------- ALL DONE! We`ve 100% cracked it when we get to here!
;now just the saving out...
;a1.l = Adr of Code save
;d0.l = Length of Code to save
moveq #0,d1 ;decryption successful
rts
reloc_error: moveq #-1,d1
rts
BR: bra.s *+$72-6
temp dc.l 0
tempptr dc.l 0
PatchType: dc.w 0
find_cmode: movem.l d0-d1/d3-d7/a0-a6,-(sp)
move.l (a5),d1 ;d1=mode used (hex)
check_fast: cmp.l #$090a0c0d,d1
bne.s not_best
lea Best.Txt(pc),a0
bsr PutStr
move.l #$0016785C,d2 ;best
bra.s got_mode
not_best: cmp.l #$090a0c0c,d1
bne.s not_vgood
lea VGood.Txt(pc),a0
bsr PutStr
move.l #$0016785C,d2 ;very good
bra.s got_mode
not_vgood: cmp.l #$090a0b0b,d1
bne.s not_good
lea Good.Txt(pc),a0
bsr PutStr
move.l #$0016785C,d2 ;good
bra.s got_mode
not_good: cmp.l #$090a0a0a,d1
bne.s not_mediocre
lea Mediocre.Txt(pc),a0
bsr PutStr
move.l #$0016785C,d2 ;mediocre
bra.s got_mode
not_mediocre: cmp.l #$09090909,d1
bne.s unknown_mode
lea Fast.Txt(pc),a0
bsr PutStr
move.l #$002CF0B8,d2 ;fast
bra.s got_mode
unknown_mode: lea Unknown.Txt(pc),a0
bsr PutStr
got_mode: lea Length.Txt(pc),a0
bsr PutStr
;d0.l = Original Length
move.l d2,-(sp)
bsr H2A
move.l (sp)+,d2
movem.l (sp)+,d0-d1/d3-d7/a0-a6
rts
H2A: lea Value.txt(pc),a0
Hex2ASCIIDec: lea hextable(pc),a1
move.b #"0",d6 ; constant
move.b #" ",d5 ; replace leading 0's
moveq #9-1,d4
ccloop move.l (a1)+,d1
cmp.l d1,d0
bcs.s get3
move.w #32-1,d3
moveq #0,d2
get1 add.l d0,d0
roxl.l #1,d2
cmp.l d1,d2
bcs.s get2
sub.l d1,d2
addq.l #1,d0
get2 dbra d3,get1
add.b d6,d0
move.b d0,(a0)+
move.l d2,d0
move.b d6,d5
bra.s get4
get3 move.b d5,(a0)+
get4 dbra d4,ccloop
add.b d6,d0
move.b d0,(a0)+
lea Value.txt(pc),a0
.getstart cmp.b #" ",(a0)+
beq.s .getstart
tst.b -(a0)
bsr PutStr
lea LFs.Txt(pc),a0
bra PutStr
hextable dc.l 1000000000
dc.l 100000000
dc.l 10000000
dc.l 1000000
dc.l 100000
dc.l 10000
dc.l 1000
dc.l 100
dc.l 10
dc.l 1
dc.l 0
*******************************************************************************
* PowerPacker FAST-Decruncher
* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
*******************************************************************************
PPDecrunch: move.l a3,a1
lea -4(a6),a2
move.l (a5),d0
lea PPB_24E(pc),a5
tst.l tempptr-PPB_24E(a5)
bne.s is_set
move.l a2,tempptr-PPB_24E(a5)
move.l (a2),temp-PPB_24E(a5)
is_set: move.l d0,(a2)
moveq #$18,d6
moveq #0,d4
moveq #1,d5
move.l d5,d7
move.l a1,a4
move.l -(a0),d1
move.l d1,-(sp) ;save unpacked length
tst.b d1
beq.s PP_22
lsr.l d7,d5
beq.s PP_5E
PP_1E: sub.b d7,d1
lsr.l d1,d5
PP_22: lsr.l #8,d1
add.l d1,a1
PP_26: lsr.l d7,d5
beq.s PP_64
PP_2A: bcs PP_CC
moveq #0,d2
PP_30: moveq #0,d1
lsr.l d7,d5
beq.s PP_6A
PP_36: roxl.w d7,d1
lsr.l d7,d5
beq.s PP_70
PP_3C: roxl.w d7,d1
add.w d1,d2
subq.w #3,d1
beq.s PP_30
moveq #0,d0
PP_46: move.b d5,d4
lsr.l #8,d5
beq.s PP_82
PP_4C: move.b -$80(a5,d4.w),d0
move.b d0,-(a1)
dbra d2,PP_46
cmp.l a1,a4
bcs.s PP_CC
bra PP_1AA
PP_5E: move.l -(a0),d5
roxr.l d7,d5
bra.s PP_1E
PP_64: move.l -(a0),d5
roxr.l d7,d5
bra.s PP_2A
PP_6A: move.l -(a0),d5
roxr.l d7,d5
bra.s PP_36
PP_70: move.l -(a0),d5
roxr.l d7,d5
bra.s PP_3C
PP_76: move.l -(a0),d5
roxr.l d7,d5
bra.s PP_D2
PP_7C: move.l -(a0),d5
roxr.l d7,d5
bra.s PP_D8
PP_82: move.b $7F(a5,d4.w),d0
move.l -(a0),d5
move.w d5,d3
lsl.w d0,d3
bchg d0,d3
eor.w d3,d4
and.w #$ff,d4
moveq #8,d1
sub.w d0,d1
lsr.l d1,d5
add.w d6,d0
bset d0,d5
bra.s PP_4C
PP_9E: move.b $7F(a5,d4.w),d0
move.l -(a0),d5
move.w d5,d3
lsl.w d0,d3
bchg d0,d3
eor.w d3,d4
and.w #$ff,d4
moveq #8,d1
sub.w d0,d1
lsr.l d1,d5
add.w d6,d0
bset d0,d5
bra.s PP_E0
PP_BA: move.l -(a0),d5
roxr.l d7,d5
bra.s PP_11A
PP_C0: move.l -(a0),d5
roxr.l d7,d5
bra.s PP_120
PP_C6: move.l -(a0),d5
roxr.l d7,d5
bra.s PP_126
PP_CC: moveq #0,d2
lsr.l d7,d5
beq.s PP_76
PP_D2: roxl.w d7,d2
lsr.l d7,d5
beq.s PP_7C
PP_D8: roxl.w d7,d2
move.b d5,d4
lsr.l #8,d5
beq.s PP_9E
PP_E0: moveq #0,d3
move.b -$80(a5,d4.w),d3
cmp.w #3,d2
bne.s PP_168
bclr #7,d3
beq.s PP_13A
moveq #13,d0
sub.b (a2,d2.w),d0
move.w d0,d1
add.w d0,d0
add.w d1,d0
add.w d0,d0
jmp PP_116(pc,d0.w)
PP_104: move.l -(a0),d5
roxr.l d7,d5
bra.s PP_12C
PP_10A: move.l -(a0),d5
roxr.l d7,d5
bra.s PP_132
PP_110: move.l -(a0),d5
roxr.l d7,d5
bra.s PP_138
PP_116: lsr.l d7,d5
beq.s PP_BA
PP_11A: roxl.w d7,d3
lsr.l d7,d5
beq.s PP_C0
PP_120: roxl.w d7,d3
lsr.l d7,d5
beq.s PP_C6
PP_126: roxl.w d7,d3
lsr.l d7,d5
beq.s PP_104
PP_12C: roxl.w d7,d3
lsr.l d7,d5
beq.s PP_10A
PP_132: roxl.w d7,d3
lsr.l d7,d5
beq.s PP_110
PP_138: roxl.w d7,d3
PP_13A: moveq #0,d1
lsr.l d7,d5
beq.s PP_156
PP_140: roxl.w d7,d1
lsr.l d7,d5
beq.s PP_15C
PP_146: roxl.w d7,d1
lsr.l d7,d5
beq.s PP_162
PP_14C: roxl.w d7,d1
add.w d1,d2
subq.w #7,d1
beq.s PP_13A
bra.s PP_198
PP_156: move.l -(a0),d5
roxr.l d7,d5
bra.s PP_140
PP_15C: move.l -(a0),d5
roxr.l d7,d5
bra.s PP_146
PP_162: move.l -(a0),d5
roxr.l d7,d5
bra.s PP_14C
PP_168: moveq #13,d0
sub.b (a2,d2.w),d0
move.w d0,d1
add.w d0,d0
add.w d1,d0
add.w d0,d0
jmp PP_17A(pc,d0.w)
PP_17A: lsr.l d7,d5
beq.s PP_1B0
PP_17E: roxl.w d7,d3
lsr.l d7,d5
beq.s PP_1B6
PP_184: roxl.w d7,d3
lsr.l d7,d5
beq.s PP_1BC
PP_18A: roxl.w d7,d3
lsr.l d7,d5
beq.s PP_1C2
PP_190: roxl.w d7,d3
lsr.l d7,d5
beq.s PP_1C8
PP_196: roxl.w d7,d3
PP_198: move.b (a1,d3.w),-(a1)
PP_19C: move.b (a1,d3.w),-(a1)
dbra d2,PP_19C
cmp.l a1,a4
bcs PP_26
PP_1AA: move.l (sp)+,d0 ;d0=unpacked length
lsr.l #8,d0 ;correct length
moveq #0,d1 ;d1=result code = all ok!
rts
PP_1B0: move.l -(a0),d5
roxr.l d7,d5
bra.s PP_17E
PP_1B6: move.l -(a0),d5
roxr.l d7,d5
bra.s PP_184
PP_1BC: move.l -(a0),d5
roxr.l d7,d5
bra.s PP_18A
PP_1C2: move.l -(a0),d5
roxr.l d7,d5
bra.s PP_190
PP_1C8: move.l -(a0),d5
roxr.l d7,d5
bra.s PP_196
or.l #$40C020A0,d0
bra.s PP_1B6
dc.b $10
dc.b $90
dc.b 'P'
dc.b $D0
dc.b '0'
dc.b $B0
dc.b 'p'
dc.b $F0
dc.b 8
dc.b $88
dc.b 'H'
dc.b $C8
dc.b '('
dc.b $A8
dc.b 'h'
dc.b $E8
dc.b $18
dc.b $98
dc.b 'X'
dc.b $D8
dc.b '8'
dc.b $B8
dc.b 'x'
dc.b $F8
dc.b 4
dc.b $84
dc.b 'D'
dc.b $C4
dc.b '$'
dc.b $A4
dc.b 'd'
dc.b $E4
dc.b $14
dc.b $94
dc.b 'T'
dc.b $D4
dc.b '4'
dc.b $B4
dc.b 't'
dc.b $F4
dc.b 12
dc.b $8C
dc.b 'L'
dc.b $CC
dc.b ','
dc.b $AC
dc.b 'l'
dc.b $EC
dc.b $1C
dc.b $9C
dc.b '\'
dc.b $DC
dc.b '<'
dc.b $BC
dc.b '|'
dc.b $FC
dc.b 2
dc.b $82
dc.b 'B'
dc.b $C2
dc.b '"'
dc.b $A2
dc.b 'b'
dc.b $E2
dc.b $12
dc.b $92
dc.b 'R'
dc.b $D2
dc.b '2'
dc.b $B2
dc.b 'r'
dc.b $F2
dc.b 10
dc.b $8A
dc.b 'J'
dc.b $CA
dc.b '*'
dc.b $AA
dc.b 'j'
dc.b $EA
dc.b $1A
dc.b $9A
dc.b 'Z'
dc.b $DA
dc.b ':'
dc.b $BA
dc.b 'z'
dc.b $FA
dc.b 6
dc.b $86
dc.b 'F'
dc.b $C6
dc.b '&'
dc.b $A6
dc.b 'f'
dc.b $E6
dc.b $16
dc.b $96
dc.b 'V'
dc.b $D6
dc.b '6'
dc.b $B6
dc.b 'v'
dc.b $F6
dc.b 14
dc.b $8E
dc.b 'N'
dc.b $CE
dc.b '.'
dc.b $AE
dc.b 'n'
dc.b $EE
dc.b $1E
dc.b $9E
dc.b '^'
dc.b $DE
dc.b '>'
dc.b $BE
dc.b '~'
dc.b $FE
PPB_24E: dc.l $18141C1
dc.l $21A161E1
dc.l $119151D1
dc.l $31B171F1
dc.l $98949C9
dc.l $29A969E9
dc.l $199959D9
dc.l $39B979F9
dc.l $58545C5
dc.l $25A565E5
dc.l $159555D5
dc.l $35B575F5
dc.l $D8D4DCD
dc.l $2DAD6DED
dc.l $1D9D5DDD
dc.l $3DBD7DFD
dc.l $38343C3
dc.l $23A363E3
dc.l $139353D3
dc.l $33B373F3
dc.l $B8B4BCB
dc.l $2BAB6BEB
dc.l $1B9B5BDB
dc.l $3BBB7BFB
dc.l $78747C7
dc.l $27A767E7
dc.l $179757D7
dc.l $37B777F7
dc.l $F8F4FCF
dc.l $2FAF6FEF
dc.l $1F9F5FDF
dc.l $3FBF7FFF
dc.l $10102
dc.l $2020203
dc.l $3030303
dc.l $3030304
dc.l $4040404
dc.l $4040404
dc.l $4040404
dc.l $4040405
dc.l $5050505
dc.l $5050505
dc.l $5050505
dc.l $5050505
dc.l $5050505
dc.l $5050505
dc.l $5050505
dc.l $5050506
dc.l $6060606
dc.l $6060606
dc.l $6060606
dc.l $6060606
dc.l $6060606
dc.l $6060606
dc.l $6060606
dc.l $6060606
dc.l $6060606
dc.l $6060606
dc.l $6060606
dc.l $6060606
dc.l $6060606
dc.l $6060606
dc.l $6060606
dc.l $6060607
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070707
dc.l $7070700
dc.b $27
dc.b $A7
even
*******************************************************************************
* PutStr
* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
* Sends a ascii text string to current console output
*
* $Inputs: a0.l = String ptr (null terminated)
*******************************************************************************
PutStr: movem.l d0-d7/a1-a6,-(sp)
move.l a0,d2
moveq #-1,d3 ;d4=0
.getlen2 addq.l #1,d3 ;increase string length by 1
tst.b (a0)+ ;increase position
bne.s .getlen2 ;nope not found, so keep on
move.l _DOSOutput(a4),d1
move.l _DOSBase(a4),a6
jsr _LVOWrite(a6) ;print error msg to cli
movem.l (sp)+,d0-d7/a1-a6
rts
*******************************************************************************
* RequestASL <NON MODIFIABLE>
* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
* Prompts user to select a filename using the ASL Requester
*
* $Inputs : a1.l=Requester Tag Structure (PTR)
* : a2.l=Requester Hail Text-String (PTR)
* $Outputs : a0.l=Pathname of selected file, or Points to ZERO if failed
* : d0.b=Flags 0,cancelled, -1,selected
*
* $SR-Flags : Z-Flag Set if requester cancelled.
*******************************************************************************
RequestASL: move.l a2,4(a1) ;hail textptr into tag struct
move.l _Asl_Request(a4),a0 ;address of requester struc
move.l _AslBase(a4),a6 ;get asl base
CALL AslRequest ;do request
tst.l d0 ;test d0
beq.s cancelled ;branch if cancelled
lea _PathBuffer(a4),a5
move.l _Asl_Request(a4),a0 ;address of requester struc
move.l rf_Dir(a0),a1 ;get dir string
move.l a5,a2 ;get output buffer
moveq #56,d0 ;set max size
copy move.b (a1)+,(a2)+ ;copy bytes
dbeq d0,copy ;until end of string or buffer
move.l a5,d1 ;get dir name (copy)
move.l rf_File(a0),d2 ;get file name
move.l #200,d3 ;size of buffer
move.l _DOSBase(a4),a6 ;get dos base
CALL AddPart ;create full pathname
tst.l d0 ;test for overflow
beq.s cancelled ;branch on error
moveq #-1,d0 ;initialise count
move.l a5,a0 ;address of buffer
checksize: addq.w #1,d0 ;decrement counter
tst.b 0(a0,d0.w) ;test for zero terminator
bne.s checksize ;branch if not found
cmpi.w #37,d0 ;is count too large
ble.s sizeok ;branch if not
sub.w #37,d0 ;subtract count from numchars
add.w d0,a0 ;add to buff adr so eostr shown
sizeok st.b d0 ;d0=$FF.b (Clear Z-Flag)
rts
cancelled suba.l a0,a0 ;no filename, clear ptr
sf.b d0 ;d0=$00.b (Set Z-Flag)
rts
*****************************************************************************
* PrintInit( )
* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
* $Inputs: None.
* $Outputs: d0.l=0 if failed..
*
* Initializes further usage of Print( ) function.
* Gets output handle, calls AllocMem() for 127 byte output buffer, and
* RawIOInit(). Preserves all registers used. This should be placed
* in your "opening" routine before any printf() calls.
* D0 will contain a non-zero value ( Z = 0 ) if AllocMem() was successful,
* otherwise D0 = 0 ( Z = 1 ) on return if failure.
*
* ( If PrintInit() fails, you don't need to quit. Print( ) and can tell that
* the allocation failed and will return without doing anything. )
******************************************************************************
_PrintInit: PUSH d0/d1/a0/a1/a6 ;store regs on stack
clr.l _PrtfBase(a4)
moveq #127,d0 ;127 bytes
move.l #(MEMF_PUBLIC+MEMF_CLEAR),d1 ;of cleared public mem
move.l (a4),a6 ;get execbase
CALL AllocMem ;allocate
move.l d0,_PrtfBase(a4)
CALL RawIOInit ;do a raw IO init
_NoPrintInit: PULL d0/d1/a0/a1/a6 ;restore regs off stack
tst.l _PrtfBase(a4)
rts
******************************************************************************
* PrintClose( )
* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
*
* If AllocMem() from PrintInit( ) was successful, this does a FreeMem()
* freeing the 127 byte output buffer. Preserves all registers used.
* This should be placed in your "closing" routine after last printf() call.
******************************************************************************
_PrintClose: PUSH d0/d1/a0/a1/a6
tst.l _PrtfBase(a4)
beq.s _NoPrintClose
move.l _PrtfBase(a4),a1
moveq #127,d0
move.l (a4),a6 ;get execbase
CALL FreeMem ;free raw io memory
_NoPrintClose: PULL d0/d1/a0/a1/a6
rts
******************************************************************************
* Usage: printf( FormatString DataStream )
* A0 A1
*
* Performs "C" language like formatting of the data stream. Where % formatting
* cmd`s are found in FormatString, they're replaced with the corresponding
* element in the DataStream.
*
* Printf() outputs the results to the current output handle, usually the CLI.
********************************************************************************
printf: tst.l _PrtfBase(a4)
beq.s _NoPrint
PUSH d0-d3/a0-a3/a6
lea PrintChar(pc),a2
move.l _PrtfBase(a4),a3
move.l (a4),a6 ;get execbase
CALL RawDoFmt
move.l _DOSBase(a4),a6
move.l _DOSOutput(a4),d1
move.l _PrtfBase(a4),d2
move.l d2,a3
moveq #-1,d3
.getlen addq.l #1,d3
tst.b (a3)+
bne.s .getlen
CALL Write
PULL d0-d3/a0-a3/a6
_NoPrint: rts
PrintChar: move.b d0,(a3)+
rts
*******************************************************************************
* _LoadDOSFile :- Loads an AmigaDOS file from any device into memory
* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
* INPUTS: a0 (.L) = Filename
*
* OUTPUTS: d0 (.L) = Result Code (0=File Ok,-1=Load Failed!)
* d1 (.L) = Length
*******************************************************************************
LoadDOSFile: movem.l d2-d7/a0-a6,-(sp)
clr.l ProgHandle(a4)
clr.l ProgBuff(a4)
clr.l ProgSize(a4)
;-------------- Open file
move.l a0,d1 ;get filename
move.l #MODE_OLDFILE,d2
move.l _DOSBase(a4),a6
jsr _LVOOpen(a6) ;open file
move.l d0,ProgHandle(a4)
beq.s NotFound
;-------------- Get Length of file
move.l d0,d5 ;ProgHandle
move.l d5,d1 ;file handle
moveq #0,d2
moveq #1,d3
move.l _DOSBase(a4),a6
jsr _LVOSeek(a6) ;seek start of file
move.l d5,d1 ;file handle
moveq #0,d2
moveq #-1,d3
jsr _LVOSeek(a6) ;seek end of file
move.l d0,ProgSize(a4)
;-------------- Allocate Memory for file
move.l 4.w,a6 ;get execbase
move.l #MEMF_PUBLIC,d1 ;we want public mem
CALL AllocMem ;allocate it...
move.l d0,ProgBuff(a4) ;save base
beq.b TooBig ;fail?
;-------------- Load in whole file
move.l ProgHandle(a4),d1
move.l d0,d2
move.l ProgSize(a4),d3
move.l _DOSBase(a4),a6
jsr _LVORead(a6) ;read file
;-------------- Close file
CloseFile: move.l ProgHandle(a4),d1
jsr _LVOClose(a6) ;close file
move.l ProgSize(a4),d1 ;d1=ProgSize
move.l ProgBuff(a4),a1
movem.l (sp)+,d2-d7/a0-a6
moveq #0,d0 ;resultcode (okay)
rts
NotFound: movem.l (sp)+,d2-d7/a0-a6
move.b #-1,d0 ;file not found error-code
rts
TooBig:
move.l ProgHandle(a4),d1
move.l _DOSBase(a4),a6
jsr _LVOClose(a6) ;close file
movem.l (sp)+,d2-d7/a0-a6
move.b #-2,d0 ;file too big error-code
NotAlloc rts
;-------------- Free Memory for DOSFile
FreeDOSFile: move.l (AbsExecBase).w,a6 ;get execbase
move.l ProgBuff(a4),d0 ;ptr to our RS.Variables base
move.l d0,a1
beq.s NotAlloc
move.l ProgSize(a4),d0 ;no. of Bytes to free
beq.s NotAlloc
jmp _LVOFreeMem(a6) ;free the memory
SaveDOSFile: movem.l d2-d7/a0-a6,-(sp)
move.l a0,d1 ;filename
move.l #MODE_NEWFILE,d2
move.l _DOSBase(a4),a6
jsr _LVOOpen(a6)
move.l d0,ProgHandle(a4)
beq.b _SaveError
move.l ProgHandle(a4),d1
move.l ProgBuff(a4),d2
move.l ProgSize(a4),d3
move.l _DOSBase(a4),a6
jsr _LVOWrite(a6) ;write file
move.l ProgHandle(a4),d1
jsr _LVOClose(a6) ;close file
movem.l (sp)+,d2-d7/a0-a6
moveq #0,d0
rts
_SaveError: movem.l (sp)+,d2-d7/a0-a6
remcode moveq #1,d0
rts
*******************************************************************************
MainTags: dc.l ASL_Height,200 ;height
dc.l ASL_Width,340 ;width
dc.l TAG_DONE ;end of taglist
LoadTags: dc.l ASL_Hail,0 ;loadtext ptr
dc.l ASL_FuncFlags,FILF_PATGAD
dc.l TAG_DONE ;end of taglist
SaveTags: dc.l ASL_Hail,0 ;savetext ptr
dc.l ASL_FuncFlags,FILF_SAVE+FILF_PATGAD
dc.l TAG_DONE ;end of taglist
******************************************************************************
* String & Data Variable definitions
LoadText: dc.b 'Load File',0
even
SaveText: dc.b 'Save File',0
even
Aslname: dc.b 'asl.library',0 ;asl lib name
even
Dosname: dc.b 'dos.library',0 ;dos lib name
even
About.Txt: CLS ; clear screen
dc.b CSI,'[0m',CSI,'[1mPPDecrypt v1.02',CSI,'[0m ',CSI,'[3m',CSI,'[33m(For Decryption of PowerPacker Encrypted Executables!) ',CSI,'[0m',LF
dc.b CSI,'[0mCopyright © 1994. All Rights Are Reserved.',LF
dc.b 'Written & Developed by 2-Cool/LSd!',LF,LF
dc.b 0
even
Select.Txt: dc.b 'Please Select File to Decrypt...',LF,LF
dc.b 0
even
ErrorType.txt dc.b $a,'Error: This is not a Normal PowerPacker v3.xx-v4.xx Encrypted file!',$a,$a,0
even
ErrorAlloc.txt dc.b $a,'Error: Out of Memory!',$a,0
even
ErrorMem.txt dc.b $a,'Error: Not enough memory to load file!',$a,0
even
ErrorASL.txt dc.b $a,'Error: The "asl.library" v36+ is required!',$a,$a,0
even
ErrorLoad.txt dc.b $a,'Error: Cannot open file!',$a,$a,0
even
ErrorSave.txt dc.b $a,'Error: Cannot save file!',$a,$a,0
even
NoName.txt dc.b "You didn`t select a valid filename!",LF,LF
dc.b 0
even
FilePath.fmt dc.b "Attempting to Load '%s'...",LF,LF
dc.b 0
even
Dot.Txt: dc.b '.',0
even
WorkingN.Txt: dc.b 'Crypto-Analysis in Progess...',LF,LF
dc.b 'Pass 1..',LF,LF
dc.b 'Compressor Used : PowerPacker v3.xx-4.xx (Password Encrypted)',LF
dc.b 'Decompression Code : Normal Header',LF
dc.b 'Compression Mode : ',0
even
WorkingH.Txt: dc.b 'Crypto-Analysis in Progess...',LF,LF
dc.b 'Pass 1..',LF,LF
dc.b 'Compressor Used : PowerPacker v3.xx-4.xx (Password Encrypted)',LF
dc.b 'Decompression Code : Library Header',LF
dc.b 'Compression Mode : ',0
even
Length.Txt: dc.b 'Original Length : ',0
even
Best.Txt: dc.b 'Best',LF,0
VGood.Txt: dc.b 'Very '
Good.Txt: dc.b 'Good',LF,0
Mediocre.Txt: dc.b 'Mediocre',LF,0
Fast.Txt: dc.b 'Fast',LF,0
Unknown.Txt: dc.b 'Unknown Mode!?',LF,0
even
Pass2.Txt dc.b 'Pass 2..',LF,0
even
Deep.Txt: dc.b LF,'Deep-Mode active, Please wait..',LF,0
FilePath2.fmt dc.b "Attempting to Save '%s'..."
LFs.Txt: dc.b LF,LF
dc.b 0
even
Value.txt: ds.b 16
even
Done.Txt: dc.b LF
dc.b 'Encryption key Generated, Password Cracked!!!',LF
dc.b 'Code patched so now you can run it without any Password!',LF
dc.b "Use 'lsd' as Passsword for unpacking with PowerPacker!",LF,LF
dc.b 0
even
Done2.Txt: dc.b LF
dc.b 'Encryption key Generated, Password Cracked!!!',LF
dc.b 'File can now be unpacked with PowerPacker or by entering',LF
dc.b "the Password as 'lsd' at the Requester Prompt when executed.",LF,LF
dc.b 0
even
Args.Txt: dc.b 'Usage : ',CSI,'[32mPPDecrypt ',CSI,'[31m<filename>',LF
dc.b 'Example : ',CSI,'[32mPPDecrypt ',CSI,'[31mMyProg',LF,LF
dc.b 'You will be prompted with the asl file-requester to select the PowerPacked',LF
dc.b 'Encrypted file to decrypt if you specify no filename.',LF,LF
dc.b 0